3A2F4	7F0057C4
		load camera/intro type value: calls next 9 entries
	3A5AC	7F005A7C	0 spawn point
	3A620	7F005AF0	1 weapon
	3A6A8	7F005B78	2 ammo
	3A6D0	7F005BA0	3 swirling intro camera
	3A758	7F005C28	4 intro animation
	3A76C	7F005C3C	5 cuff/character
	3A780	7F005C50	6 fixed cameras
	3A844	7F005D14	7 watch time
	3A8BC	7F005D8C	8 credits

Uses TLB entries in 21990

+_+

//7F005A38:	parse intro block command list
LW	V0,0000 (S0)	;V0=action/intro type
ADDIU	AT,R0,0009
LUI	S2,8008
BEQ	V0,AT,7F005DF4	;if type=9, end
LUI	AT,42C8
MTC1	AT,F22		;F22=100.0
LUI	AT,4780
MTC1	AT,F20		;F20=65536.0
ADDIU	S2,S2,A0B0	;S2=8007A0B0
SLTIU	AT,V0,0009
//7F005A60:
BEQ	AT,R0,7F005DE0
SLL	T8,V0,0x2	;convert to pointer offset
LUI	AT,8005
ADDU	AT,AT,T8
LW	T8,F1AC (AT)	;TBL entry @ 8004F1AC
JR	T8
NOP

7F005A7C	3A5AC	Type 0: spawn
	00000000 PPPPPPPP SSSSSSSS
3C0E8007	LUI	T6,8007
8DCE5D18	LW	T6,5D18 (T6)	;T6=80075D18: p->0xxx presets
11C00018	BEQ	T6,R0,7F005AE8	;kill if NULL pointer
00000000	NOP
0FC30288	JAL	7F0C0A20	;ret V0=set#
00000000	NOP
8E0F0008	LW	T7,0008 (S0)	;T7=command.set#
3C0A8007	LUI	T2,8007
3C018008	LUI	AT,8008
144F0011	BNE	V0,T7,7F005AE8	;kill if sets do not match
00000000	NOP
8E080004	LW	T0,0004 (S0)	;T0=command.preset#
3C028008	LUI	V0,8008
8C429C68	LW	V0,9C68 (V0)	;V0=80079C68: # spawn points
00084880	SLL	T1,T0,0x2
01284823	SUBU	T1,T1,T0
8D4A5D18	LW	T2,5D18 (T2)	;T2=80075D18: p->0xxx presets
00094880	SLL	T1,T1,0x2
01284823	SUBU	T1,T1,T0
00094880	SLL	T1,T1,0x2	;T1=preset * 0x28
00026080	SLL	T4,V0,0x2	;T4=#spawns->offset
002C0821	ADDU	AT,AT,T4
012A5821	ADDU	T3,T1,T2	;T3=: p->presets + offset to selected preset
AC2B9C28	SW	T3,9C28 (AT)	;T3->80079C28+offset: p->preset saved to spawn table
3C018008	LUI	AT,8008
244D0001	ADDIU	T5,V0,0001	;T5=#spawns+1
AC2D9C68	SW	T5,9C68 (AT)	;#spawns+1 -> 80079C68
//7F005AE8:
100000BE	BEQ	R0,R0,7F005DE4
2610000C	ADDIU	S0,S0,000C

7F005AF0	3A620	Type 1: weapon
	00000001 RRRRRRRR LLLLLLLL SSSSSSSS
0FC30288	JAL	7F0C0A20	;ret V0=set#
00000000	NOP
8E19000C	LW	T9,000C (S0)	;T9=command.set#
1459001C	BNE	V0,T9,7F005B70	;kill if sets do not match
00000000	NOP
0FC015C4	JAL	7F005710	;preload: sets weapon model for generated object
8E040004	LW	A0,0004 (S0)	;A0=right weapon
8E040008	LW	A0,0008 (S0)	;A0=left weapon
04800008	BLTZ	A0,7F005B34	;end if no left weapon
00000000	NOP
0FC015C4	JAL	7F005710	;preload: sets weapon model for generated object
00000000	NOP
8E040004	LW	A0,0004 (S0)	;A0=right weapon
0FC23143	JAL	7F08C50C	;add doubles (A0+A1) to inventory
8E050008	LW	A1,0008 (S0)	;A1=left weapon
10000004	BEQ	R0,R0,7F005B40
8FB8007C	LW	T8,007C (SP)
//7F005B34:	right-weapon only
0FC23122	JAL	7F08C488	;add weapon A0 to inventory
8E040004	LW	A0,0004 (S0)	;A0=right weapon
8FB8007C	LW	T8,007C (SP)
//7F005B40:	sets default weapon drawn at start?
1700000B	BNEZ	T8,7F005B70
00000000	NOP
8E0E0004	LW	T6,0004 (S0)	;T6=right weapon
3C018008	LUI	AT,8008
240F0001	ADDIU	T7,R0,0001
AC2E99E0	SW	T6,99E0 (AT)	;r.weapon->800799E0
8E040008	LW	A0,0008 (S0)	;A0=left weapon
AFAF007C	SW	T7,007C (SP)	;SP+7C=1
3C018008	LUI	AT,8008
04800002	BLTZ	A0,7F005B70	;skip if no left weapon
00000000	NOP
AC2499E4	SW	A0,99E4 (AT)	;l.weapon->800799E4
//7F005B70:
1000009C	BEQ	R0,R0,7F005DE4
26100010	ADDIU	S0,S0,0010

7F005B78	3A6A8	Type 2: ammo
	00000002 TTTTTTTT QQQQQQQQ SSSSSSSS
0FC30288	JAL	7F0C0A20	;ret V0=set#
00000000	NOP
8E08000C	LW	T0,000C (S0)	;T0=command.set#
14480004	BNE	V0,T0,7F005B98	;kill if sets don't match
00000000	NOP
8E040004	LW	A0,0004 (S0)	;A0=ammo type
0FC1A44C	JAL	7F069130	;add ammo type A0, total A1 to inventory
8E050008	LW	A1,0008 (S0)	;A1=ammo total
//7F005B98:
10000092	BEQ	R0,R0,7F005DE4
26100010	ADDIU	S0,S0,0010

7F005BA0	type 3: swirling intro camera
	00000003 -------- XXXXXXXX YYYYYYYY
	ZZZZZZZZ LLLLLLLL RRRRRRRR --------
3C098003	LUI	T1,8003
8D2964AC	LW	T1,64AC (T1)	;T1=800364AC: p->first entry in rotating camera
02001025	OR	V0,S0,R0	;V0=S0: p->command
3C018003	LUI	AT,8003
55200003	BNEL	T1,R0,7F005BD0	;branch if valid pointer
8C4A0008	LW	T2,0008 (V0)
AC3064AC	SW	S0,64AC (AT)	;p->command -> 800364AC: first entry in rot. camera
8C4A0008	LW	T2,0008 (V0)	;T2=command+8:x offset
//7F005BD0:	convert percentages into multipliers
8C4B000C	LW	T3,000C (V0)	;T3=command+C: y offset
8C4C0010	LW	T4,0010 (V0)	;T4=command+10: z offset
448A9000	MTC1	T2,F18
448B4000	MTC1	T3,F8
8C4D0014	LW	T5,0014 (V0)	;T5=lateral rotation
46809120	CVT.S.W	F4,F18	;F4=(float) x offset
448C9000	MTC1	T4,F18
8C590018	LW	T9,0018 (V0)	;T9=rate
26100020	ADDIU	S0,S0,0020	;S0+=20: next command
468042A0	CVT.S.W	F10,F8	;F10=(float) y offset
448D4000	MTC1	T5,F8
46142183	DIV.S	F6,F4,F20	;F6=x offset/0x10000: percentage change
46809120	CVT.S.W	F4,F18	;F4=(float) z offset
44999000	MTC1	T9,F18
46145403	DIV.S	F16,F10,F20	;F16=y offset/0x10000: percentage change
E4460008	SWC1	F6,0008 (V0)	;replace x offset with multiplier
468042A0	CVT.S.W	F10,F8	;F10=(float) lateral rotation
46142183	DIV.S	F6,F4,F20	;F6=z offset/0x10000: percentage change
E450000C	SWC1	F16,000C (V0)	;replace y offset with multiplier
46809120	CVT.S.W	F4,F18	;F4=rate
46145403	DIV.S	F16,F10,F20	;F16=lateral rot./0x10000: percentage change
E4460010	SWC1	F6,0010 (V0)	;replace z offset with multiplier
46142183	DIV.S	F6,F4,F20	;F6=rate/0x10000: percentage change
E4500014	SWC1	F16,0014 (V0)	;replace lat.rot. with multiplier
10000070	BEQ	R0,R0,7F005DE4
E4460018	SWC1	F6,0018 (V0)	;replace rate with multiplier


7F005C28	type 4: use Bond default intro animation #
	00000004 ########
LW	T8,0004 (S0)	//grab value following type
LUI	AT,8003
ADDIU	S0,S0,0008	//advance address to next command
BEQ	R0,R0,7F005DE4
SW	T8,6514 (AT)	//store value to 80036514

7F005C3C	type 5: set hand/cuff (also sets model in solo)
	00000005 ########
LW	T6,0004 (S0)	//T6=value following type
LW	T7,0000 (S2)	//handle to character data
ADDIU	S0,S0,0008	//advance address to next command
BEQ	R0,R0,7F005DE4
SW	T6,041C (T7)	//character/cuff-> data+41C

7F005C50:	type 6: fixed intro cameras
	00000006 XXXXXXXX YYYYYYYY ZZZZZZZZ
	LLLLLLLL VVVVVVVV -------- TTTTTTTT
	TTTTTTTT CCCCCCCC
0FC26C54	JAL	7F09B150	;V0=player#
00000000	NOP
1440002C	BNEZ	V0,7F005CBC	;only do once
3C088003	LUI	T0,8003
8D0864B8	LW	T0,64B8 (T0)	;T0=800364B8:last command in list
3C098003	LUI	T1,8003
3C018003	LUI	AT,8003
AE080024	SW	T0,0024 (S0)	;command+24=p->previous command
8D2964BC	LW	T1,64BC (T1)	;T1=800364BC: count of entries
AC3064B8	SW	S0,64B8 (AT)	;p->command -> 800364B8:last command in list
3C018003	LUI	AT,8003
252A0001	ADDIU	T2,T1,0001	;T2=count+1
AC2A64BC	SW	T2,64BC (AT)	;800364BC=count++
8E0B0004	LW	T3,0004 (S0)	;T3=command+4: x offset
8E0C0008	LW	T4,0008 (S0)	;T4=command+8: y offset
8E0D000C	LW	T5,000C (S0)	;T5=command+C: z offset
448B4000	MTC1	T3,F8
448C9000	MTC1	T4,F18
8E190010	LW	T9,0010 (S0)	;T9=command+10: lateral rotation
468042A0	CVT.S.W	F10,F8	;F10=(float) x offset
448D4000	MTC1	T5,F8
8E180014	LW	T8,0014 (S0)	;T8=command+14: vertical rotation
9604001E	LHU	A0,001E (S0)	;A0=text value 1
46809120	CVT.S.W	F4,F18	;F4=(float) y offset
44999000	MTC1	T9,F18
46165403	DIV.S	F16,F10,F22	;F16=x offset/100: x percentage
468042A0	CVT.S.W	F10,F8	;F10=(float) z offset
44984000	MTC1	T8,F8
46162183	DIV.S	F6,F4,F22	;F6=y offset/100: y percentage
E6100004	SWC1	F16,0004 (S0)	;replace x offset with multiplier
46809120	CVT.S.W	F4,F18	;F4=(float) lateral rotation
46165403	DIV.S	F16,F10,F22	;F16=z offset/100: z percentage
E6060008	SWC1	F6,0008 (S0)	;replace y offset with multiplier
468042A0	CVT.S.W	F10,F8	;F10=(float) vertical rotation
46142183	DIV.S	F6,F4,F20	;F6=lat.rot./0x10000: lat.rot.multiplier
E610000C	SWC1	F16,000C (S0)	;replace z offset with multiplier
46145403	DIV.S	F16,F10,F20	;F16=vert.rot./0x10000: vert.rot.multiplier
E6060010	SWC1	F6,0010 (S0)	;replace lat.rot. with multiplier
0FC30776	JAL	7F0C1DD8	;V0=p->text A0
E6100014	SWC1	F16,0014 (S0)	;replace vert.rot. with multiplier
8E030020	LW	V1,0020 (S0)	;V1=command+20: text value 2
AE02001C	SW	V0,001C (S0)	;replace text 1 ID w/ p->text
10600004	BEQ	V1,R0,7F005CBC	;branch if text 2 not present
00000000	NOP
0FC30776	JAL	7F0C1DD8	;V0=p->text A0
3064FFFF	ANDI	A0,V1,FFFF
AE020020	SW	V0,0020 (S0)	;replace text 2 ID w/ p->text
//7F005CBC:	return
10000035	BEQ	R0,R0,7F005DE4
26100028	ADDIU	S0,S0,0028	;S0+=28: next command


7F005D14	type 7: watch time for solo watch menu
	00000007 HHHHHHHH MMMMMMMM
SW	R0,0000 (S1)
LW	A0,0008 (S0)	;A0=minutes
ADDIU	AT,R0,003C
BLEZL	A0,7F005D50
LW	V0,0004 (S0)
DIV	A0,AT
MFHI	T7		;T7=minutes % 60
SLL	T0,T7,0x3
SUBU	T0,T0,T7
SLL	T0,T0,0x5
ADDU	T0,T0,T7
SLL	T0,T0,0x4	;T0=min. * 3600: minutes->milliseconds (sort of...)
LUI	AT,8008
SW	T0,9A24 (AT)	;80079A24=ms.
//7F005D50:	hours
LW	V0,0004 (S0)	;V0=hours
ADDIU	AT,R0,000C
BLEZ	V0,7F005D84	;skip if not valid
NOP
DIV	V0,AT
MFHI	T3		;T3=hours % 12
LUI	AT,0003
ORI	AT,AT,4BC0
MULTU	T3,AT
LW	T2,0000 (S1)	;T2=time
LUI	AT,8008
MFLO	T4		;T4=hours * 216000: hours->milliseconds (sort of)
ADDU	T5,T2,T4	;T5=(ms)hours+time
SW	T5,9A24 (AT)	;T5->80079A24
//7F005D84:
BEQ	R0,R0,7F005DE4
ADDIU	S0,S0,000C

7F005D8C	type 8: credits
LUI	T9,8007
LW	T9,5D28 (T9)
LW	T8,0004 (S0)
LUI	AT,8003
ADDU	V0,T9,T8
SW	V0,6440 (AT)
LHU	T7,0000 (V0)
BNEL	T7,R0,7F005DC0
LHU	T0,000C (V0)
LHU	T6,0002 (V0)
BEQ	T6,R0,7F005DD8
NOP
LHU	T0,000C (V0)
//7F005DC0:
ADDIU	V0,V0,000C
BNEL	T0,R0,7F005DC0
LHU	T0,000C (V0)
LHU	T1,0002 (V0)
BNEL	T1,R0,7F005DC0
LHU	T0,000C (V0)
//7F005DD8:
BEQ	R0,R0,7F005DE4
ADDIU	S0,S0,0008

7F005DE0	next in list!
ADDIU	S0,S0,0004
//7F005DF4:	end
